//Relojes de arena:
	//Reloj de 11 minutos: dos partes: r11H y r11L
	//Reloj de 7 minutos: dos partes: r7H y r7L
        //Se tienen que girar siempre los 2, solo se gira uno en el caso de que r_H este a cero    
	
	//Estado: (r11H, r11L, r7H, r7L)
	//Solucion: se alcanza cuando una de las partes de uno de los relojes tiene 1 minuto.
	//Estado objetivo: (1,10,0,7) Solución única, ya que esta siempre será la primera configuación alcanzable.

package Problemas;
import Busquedas.Estado;


public class RelojesArena extends Problema {

	
	
	
	private int r11H;
	
	private int r11L;
	
	private int r7H;
	
	private int r7L;
	
	public RelojesArena() {
		int []paramInicial = {11,0,7,0};
         int []paramObjetivo= {1,10,0,7};
		Estado inicial = new Estado(paramInicial);
        Estado []objetivo = new Estado[1];
		objetivo[0]=new Estado(paramObjetivo);
        String [] nombresOperadores={"padre","vueltaALos2","vuelta11","vuelta7"};
		int [] costeOperadores={2,1,1};
		inicializa(inicial,objetivo,3,nombresOperadores,costeOperadores);
	}

	
	public void asignaParametros(Estado actual){
		r11H = actual.getParametro(0);
		r11L = actual.getParametro(1);
		r7H = actual.getParametro(2);	
		r7L = actual.getParametro(3);
	}
	
	
	public Estado vueltaALos2(Estado actual){
		asignaParametros(actual);
		if ((r11H>0)&&(r7H>0)){
			boolean vacio=false;
			while (!vacio){
				r11H-=1;
				r11L+=1;
				r7H-=1;
				r7L+=1;
				if ((r11H==0) || (r7H==0)){
					vacio=true;
				}
			}
			int param[] = {r11H,r11L,r7H,r7L};
			return new Estado(param);
		}
		return null;
	}
	
	
	
	public Estado vuelta11(Estado actual){
		asignaParametros(actual);
		if (r11H==0){
			r11H=11;
			r11L=0;
			int param[] = {r11H,r11L,r7H,r7L};
			return new Estado(param);
		}
		return null;
	}
	
	
	public Estado vuelta7(Estado actual){
		asignaParametros(actual);
		if (r7H==0){
			r7H=7;
			r7L=0;
			int param[] = {r11H,r11L,r7H,r7L};
			return new Estado(param);
		}
		return null;
	}
	
		
	//@Override
	public Estado aplicaOperador(Estado actual, int i) {
		Estado siguiente = null;
		switch(i){
		case 0:
			siguiente = vueltaALos2(actual);
			break;
		case 1:
			siguiente = vuelta11(actual);
			break;
		case 2:
			siguiente = vuelta7(actual);
			break;
		}
		return siguiente;
	}

	
	//@Override
	public int getOperadorInverso(int op) {
		return -1;
	}

        public int funcionHeuristica(Estado estado){
		return 0;
	}

}
